home *** CD-ROM | disk | FTP | other *** search
/ Java 1996 August / Java - Summer 1996.iso / kaffe-0.2 / kaffe / readClass.c < prev    next >
C/C++ Source or Header  |  1996-02-17  |  3KB  |  183 lines

  1. /*
  2.  * readClass.c
  3.  * Read in a new class.
  4.  *
  5.  * Copyright (c) 1996 Systems Architecture Research Centre,
  6.  *           City University, London, UK.
  7.  *
  8.  * See the file "license.terms" for information on usage and redistribution
  9.  * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
  10.  *
  11.  * Written by Tim Wilkinson <tim@sarc.city.ac.uk>, February 1996.
  12.  */
  13.  
  14. #define    DBG(s)
  15.  
  16. #include <stdio.h>
  17. #include <assert.h>
  18. #include <unistd.h>
  19. #include <string.h>
  20. #include "readClassConfig.h"
  21. #include "gtypes.h"
  22. #include "file.h"
  23. #include "constants.h"
  24. #include "readClass.h"
  25. #include "access.h"
  26.  
  27. void readInterfaces(classFile*, classes*);
  28. void readMethods(classFile*, classes*);
  29. void readFields(classFile*, classes*);
  30. void readAttributes(classFile*, classes*, methods*);
  31.  
  32. constants* constant_pool;
  33.  
  34. void
  35. readClass(classFile* fp)
  36. {
  37.     u2 minor_version;
  38.     u2 major_version;
  39.     u4 magic;
  40.     u2 access_flags;
  41.     u2 this_class;
  42.     u2 super_class;
  43.     classes* classThis;
  44.  
  45.     /* Read in class info */
  46.     readu4(&magic, fp);
  47.     if (magic != JAVAMAGIC) {
  48.         fprintf(stderr, "Bad magic %x in class\n", magic);
  49.         exit(1);
  50.     }
  51.     readu2(&minor_version, fp);
  52.     readu2(&major_version, fp);
  53.  
  54. DBG(    printf("major=%d, minor=%d\n", major_version, minor_version);    )
  55.  
  56.     if (major_version != MAJOR_VERSION) {
  57.         fprintf(stderr, "Warning: Major version number mismatch.\n");
  58.     }
  59.     if (minor_version != MINOR_VERSION) {
  60.         fprintf(stderr, "Warning: Minor version number mismatch.\n");
  61.     }
  62.  
  63.     constant_pool = readConstantPool(fp);
  64.     assert(constant_pool != 0);
  65.  
  66.     readu2(&access_flags, fp);
  67.     readu2(&this_class, fp);
  68.     readu2(&super_class, fp);
  69.  
  70. #ifdef ADDCLASS
  71.     ADDCLASS(this_class, super_class, access_flags, constant_pool);
  72. #else
  73.     classThis = 0;
  74. #endif
  75.  
  76.     readInterfaces(fp, classThis);
  77.     readFields(fp, classThis);
  78.     readMethods(fp, classThis);
  79.     readAttributes(fp, classThis, 0);
  80. }
  81.  
  82. /*
  83.  * Read in interfaces.
  84.  */
  85. void
  86. readInterfaces(classFile* fp, classes* this)
  87. {
  88.     u2 interfaces_count;
  89.  
  90.     readu2(&interfaces_count, fp);
  91. DBG(    printf("interfaces_count=%d\n", interfaces_count);    )
  92.  
  93. #ifdef READINTERFACES
  94.     READINTERFACES(fp, this, interfaces_count);
  95. #else
  96.     fseek(fp, interfaces_count * 2, SEEK_CUR);
  97. #endif
  98. }
  99.  
  100. /*
  101.  * Read in fields.
  102.  */
  103. void
  104. readFields(classFile* fp, classes* this)
  105. {
  106.     int i;
  107.     u2 fields_count;
  108.  
  109.     readu2(&fields_count, fp);
  110. DBG(    printf("fields_count=%d\n", fields_count);        )
  111.  
  112. #if defined(READFIELD_START)
  113.     READFIELD_START();
  114. #endif
  115.     for (i = 0; i < fields_count; i++) {
  116. #if defined(READFIELD)
  117.         READFIELD(fp, this);
  118. #else
  119.         fseek(fp, 6, SEEK_CUR);
  120. #endif
  121.         readAttributes(fp, this, 0);
  122.     }
  123. #if defined(READFIELD_END)
  124.     READFIELD_END();
  125. #endif
  126. }
  127.  
  128. /*
  129.  * Read in attributes.
  130.  */
  131. void
  132. readAttributes(classFile* fp, classes* this, methods* methodThis)
  133. {
  134.     int i;
  135.     u2 cnt;
  136.  
  137.     readu2(&cnt, fp);
  138. DBG(    printf("attributes_count=%d\n", cnt);                )
  139.  
  140.     /* Skip attributes for the moment */
  141.     for (i = 0; i < cnt; i++) {
  142. #ifdef READATTRIBUTE
  143.         READATTRIBUTE(fp, this, methodThis);
  144. #else
  145.         u2 idx;
  146.         u4 len;
  147.         readu2(&idx, fp);
  148.         readu4(&len, fp);
  149.         fseek(fp, len, SEEK_CUR);
  150. #endif
  151.     }
  152. }
  153.  
  154. /*
  155.  * Read in methods.
  156.  */
  157. void
  158. readMethods(classFile* fp, classes* this)
  159. {
  160.     int i;
  161.     u2 methods_count;
  162.     methods* methodThis;
  163.  
  164.     readu2(&methods_count, fp);
  165. DBG(    printf("methods_count=%d\n", methods_count);        )
  166.     methodThis = 0;
  167.  
  168. #ifdef READMETHOD_START
  169.     READMETHOD_START();
  170. #endif
  171.     for (i = 0; i < methods_count; i++) {
  172. #ifdef READMETHOD
  173.         READMETHOD(fp, this);
  174. #else
  175.         fseek(fp, 6, SEEK_CUR);
  176. #endif
  177.         readAttributes(fp, this, methodThis);
  178.     }
  179. #ifdef READMETHOD_END
  180.     READMETHOD_END();
  181. #endif
  182. }
  183.